package main

import (
	"fmt"
	"io"
	"log"
	"net"

	"gitee.com/go-course/go8/micro/rpc/grpc/stream/pb"
	"gitee.com/go-course/go8/micro/rpc/grpc/stream/server/auth"
	"github.com/infraboard/mcube/logger/zap"
	"google.golang.org/grpc"
)

func main() {
	zap.DevelopmentSetup()

	// 如果把我们实现了接口的对象HelloServiceServerImpl 注册给grpc框架

	// 1. 首先是通过grpc.NewServer()构造一个gRPC服务对象
	// 1.1 流拦截器
	grpcServer := grpc.NewServer(grpc.ChainStreamInterceptor(auth.NewServerAuthInceptorImpl().Auth))

	// 2. 把实现了接口的对象注册给grpc server
	// go-grpc插件，帮忙生成了对象的注册方法
	// 把HelloServiceServer的实现HelloServiceServerImpl注册给grpcServer
	pb.RegisterHelloServiceServer(grpcServer, &helloServiceChannelServerImpl{})

	// 3. 启动Grpc服务器, grpcServer是建立在HTTP2 网络之上的
	lis, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal(err)
	}
	if err := grpcServer.Serve(lis); err != nil {
		panic(err)
	}
}

// 写一个接口的实现类
type helloServiceChannelServerImpl struct {
	pb.UnimplementedHelloServiceServer
}

// 实现流式响应
func (i *helloServiceChannelServerImpl) Channel(stream pb.HelloService_ChannelServer) error {
	for {
		// 1. 接收用户请求<也可以不处理>
		req, err := stream.Recv()
		if err != nil {
			// 如果遇到io.EOF表示客户端流被关闭
			if err == io.EOF {
				return nil
			}
			return err
		}

		// 2. 处理用响应
		err = stream.Send(&pb.Response{Value: fmt.Sprintf("hello, %s", req.Value)})
		if err != nil {
			return err
		}
	}
}
